from collections import Iterable

# 展开嵌套的序列，想将一个多层嵌套的序列展开成一个单层列表
def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        # isinstance函数检查某个元素是否是可迭代的
        # 如果是的话yield from 就会返回所有子例程的值，最终返回结果就是一个没有嵌套的简单序列了
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            # yield from 在生成器中调用其他生成器作为子例程，如不使用需要额外的for循环
            yield from flatten(x)
        else:
            yield x

def demo_1():
    items = [1,2,[3,4,[5,6],7],8]
    for x in flatten(items):
        print(x)
    items_str = ['Dave', 'Paula', ['Thomas', 'Lewis']]
    for x in flatten(items_str):
        print(x)

if __name__ == '__main__':
    demo_1()